package Socket;

import java.io.*;
import java.net.*;

/**
*   Una clase de envoltura de Socket que contiene
*   m�todos para mandar y recibir mensajes.
*   @bibliography: Computacion Distribuida. M. L. Lio. Pearson-Addison Wesley. pp 113-117.
*   @author: M. L. Liu
*/
public class SocketBytes extends Socket {
  private Socket socket;
  private InputStream entrada_in;
  private OutputStream salida_out;

  public SocketBytes(String maquinaAceptadora, int puertoAceptador) 
    throws SocketException, IOException {
    socket = new Socket(maquinaAceptadora, puertoAceptador);
    establecerFlujos();
  } // constructor

  public SocketBytes(Socket socket)throws IOException {
    this.socket = socket;
    establecerFlujos();
  } // constructor

  private void establecerFlujos() throws IOException {
    // obtiene un flujo de entrada y de salida para (leer del / escribir al) socket de datos
    entrada_in = socket.getInputStream();
    salida_out = socket.getOutputStream();
  } // establecerFlujos

  public void enviaMensaje(Object mensaje) throws IOException {
    ObjectOutputStream salida = new ObjectOutputStream(salida_out);    
    salida.writeObject(mensaje);
    // la subsiguiente llamada al m�todo flush es necesaria para que
    // los datos se escriban en el flujo de datos del socket
    // antes de que se cierre el socket.
    salida.flush();
  } // enviaMensaje

  public Object recibeMensaje() throws IOException, ClassNotFoundException, SocketException, InterruptedIOException {
    ObjectInputStream entrada = new ObjectInputStream(entrada_in);
    Object mensaje = entrada.readObject();
    return mensaje;
  } // recibeMensaje

  public void close() throws IOException {
    socket.close();
  } // close

  public void setSOTimeout(int plazo) throws SocketException {
    socket.setSoTimeout(plazo);
  } // setSoTimeout

  public boolean isInputShutdown() {
    return socket.isInputShutdown();
  } // isInputShutdown
} // SocketBytes